package ar.com.uade.administradorsiembra.persistencia;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import ar.com.uade.administradorsiembra.common.ContextoTransaccional;
import ar.com.uade.administradorsiembra.modelo.Cereal;
import ar.com.uade.administradorsiembra.modelo.Cosecha;
import ar.com.uade.administradorsiembra.modelo.ItemCosecha;
import ar.com.uade.administradorsiembra.modelo.exceptions.TransaccionException;

public class CosechaMapper extends Mapper<Cosecha> {
	
	private CerealMapper cerealMapper;
	private ItemCosechaMapper itemCosechaMapper;
	
	public CosechaMapper() {
	    	this.cerealMapper = new CerealMapper();
	    	this.itemCosechaMapper = new ItemCosechaMapper();
	}

	@Override
	public boolean guardarTodos(List<Cosecha> instancias)
			throws TransaccionException {
		boolean resultado = false;
		
		if(instancias != null && !instancias.isEmpty()) {
			for (Cosecha cosecha : instancias) {
				this.guardar(cosecha);
			}
		}
		
		return resultado;
	}

	@Override
	public boolean guardar(Cosecha instancia) throws TransaccionException {
		
		int resultado = 0;
		this.logger.info("Guardando el siguiente cosecha: " + instancia);
		
		if(instancia.getId() != null){
			ContextoTransaccional contexto = null;
			
			try {
				contexto = super.administradorTransaccional.crearContexto(true);			
				
				String query = "INSERT INTO cosecha(idCereal,fechaDesde,fechaHasta,cantidadCosecha) VALUES(?,?,?,?)";		
				List<Object> parametros = new ArrayList<Object>();
				
				parametros.add(instancia.getCereal().getId());
				parametros.add(instancia.getFechaDesde());
				parametros.add(instancia.getFechaHasta());
				parametros.add(instancia.getCantidadCosecha());
				
				try {
					resultado = this.executeUpdate(query, parametros, contexto.getConexionActual());
					this.logger.info("Se guardo el cosecha en forma exitosa.");
					
					
				} catch (SQLException e) {
					this.logger.error("Error al guardar el cosecha. " + e.getMessage());
				}
			} catch (TransaccionException te) {
				this.logger.error("Error al guardar el cosecha. " + te.getMessage());
			} finally {
				contexto.liberarConexion();
			}
			
			return resultado > 0;
		}
		else{
			return this.modificar(instancia);
		}
	}

	@Override
	public boolean modificar(Cosecha instancia) throws TransaccionException {
		this.logger.error("Voy a modificar el instancia: " + instancia);
		
		int resultado = 0;
		ContextoTransaccional contexto = null;
		
		try {
			contexto = super.administradorTransaccional.crearContexto(true);
			
			String query = "UPDATE  cosecha    SET  idCereal  = ?, fechaDesde  = ? , fechaHasta  = ? , cantidadCosecha  = ? WHERE id = ?";
			List<Object> parametros = new ArrayList<Object>();
			
			parametros.add(instancia.getCereal().getId());
			parametros.add(instancia.getFechaDesde());
			parametros.add(instancia.getFechaHasta());
			parametros.add(instancia.getCantidadCosecha());
			parametros.add(instancia.getId());
			
			try {			
				resultado = this.executeUpdate(query, parametros, contexto.getConexionActual());	
				
				List<ItemCosecha> cosechas = instancia.getDistribucionCosecha();
				for (ItemCosecha itemCosecha : cosechas) {
					this.itemCosechaMapper.guardar(itemCosecha);
				}
			} catch (SQLException e) {
				this.logger.error("Error al modificar el instancia. " + e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el instancia. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}	
		
		return resultado > 0;
	}

	@Override
	public boolean borrar(Cosecha instancia) throws TransaccionException {
		
		this.logger.error("Borrando el mineral: " + instancia);
		
		int resultado = 0;
		ContextoTransaccional contexto = null;
		
		try {
			List<ItemCosecha> cosechas = instancia.getDistribucionCosecha();
			for (ItemCosecha itemCosecha : cosechas) {
				this.itemCosechaMapper.borrar(itemCosecha);
			}
			
			contexto = super.administradorTransaccional.crearContexto(true);
			
			String query = "Delete From cosecha WHERE id = ?";		
			List<Object> parametros = new ArrayList<Object>();
			
			parametros.add(instancia.getId());
			
			try {		
				resultado = this.executeUpdate(query, parametros, contexto.getConexionActual());
				
			} catch (SQLException e) {
				this.logger.error("Error al borrar el instancia. " + e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el instancia. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}
	
		return resultado > 0;
	}

	@Override
	public List<Cosecha> buscarTodos() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Cosecha buscarPorId(Integer id) {
		
		this.logger.info("Buscando mineral por id: " + id);
		
		Cosecha cosecha = null;
		ContextoTransaccional contexto = null;
		
		try {
			contexto = super.administradorTransaccional.crearContexto(true);		
			
			String query = "SELECT  id, idCereal, fechaDesde, fechaHasta, cantidadCosecha FROM  cosecha  where id = ?";
			List<Object> parametros = new ArrayList<Object>();
			
			parametros.add(id);
			
			ResultSet rs;
			
			try {				
				rs = this.executeQuery(query, parametros, contexto.getConexionActual());

				if(rs.next()){
					
					Integer idCereal = rs.getInt("idCereal");
					Cereal cereal = this.cerealMapper.buscarPorId(idCereal);
					List<ItemCosecha> itemsCosechas = this.itemCosechaMapper.buscarPorIdCosecha(rs.getInt("id"));
					cosecha = new Cosecha(rs.getInt("id"), cereal, rs.getDate("fechaDesde"), rs.getDate("fechaHasta"), rs.getFloat("cantidadCosecha"));
					cosecha.setDistribucionCosecha(itemsCosechas);
					this.logger.info("Mineral encontrado: " + cosecha);			
				}			
			} catch (SQLException e) {
				this.logger.error("Error al buscar el cosecha. " + e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el cosecha. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}
	
		return cosecha;
	
	}

}
